public class BinarySearchAlter {

    /**
     * 二分查找修改版
     *
     * @param A      : 有序数组a
     * @param target : 目标查找值
     * @return 返回索引值
     */
    public static int binarySearchAlter(int[] A, int target) {
        // 改动一: 其中右指针j作为边界, 必须不参与运算比较
        int i = 0, j = A.length;
        // 定义循环条件 , 改动二: 由于不让j指针值参与比较, 故不需要i=j的情况,当i=j时,j被带着参与了比较,当target值不是数组值的时候,会导致死循环的情况
        while (i < j) {
            int m = (i + j) >>> 1;
            if (target < A[m]) {
                // 改动三: j作为边界,不参与比较.故当判断出来target值在m指针左侧时,m指针对应值已经判断过了,不可能和target相等,让j=m,及让j作为一个不可能相等的边界使用
                j = m;
            } else if (A[m] < target) {
                i = m + 1;
            } else {
                return m;
            }
        }
        return -1;
    }
}
